package simulacion;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.util.ArrayList;
import javax.swing.ImageIcon;
import javax.swing.JPanel;

public class DMapa extends JPanel implements Runnable {

    public DMapa() {
        escenario = (new ImageIcon(getClass().getResource("/imagenes/mapar.png")).getImage());
        semaforo = (new ImageIcon(getClass().getResource("/imagenes/semaforoo.png")).getImage());
        carro = (new ImageIcon(getClass().getResource("/imagenes/carro.png")).getImage());
        posicion_x = 0;
        posicion_y = 0;
    }

    public DMapa(int punto1, int punto2, byte orientacion) {
        escenario = (new ImageIcon(getClass().getResource("/imagenes/mapar.png")).getImage());
        semaforo = (new ImageIcon(getClass().getResource("/imagenes/semaforoo.png")).getImage());
        carro = (new ImageIcon(getClass().getResource("/imagenes/carro.png")).getImage());
        if (orientacion == HORIZONTAL) {
            this.posicion_x = (punto2 - 1) * 48;
            this.posicion_y = punto1 * 48 - 1;
        } else if (orientacion == VERTICAL) {
            this.posicion_x = punto1 * 48 - 1;
            this.posicion_y = (punto2 - 1) * 48;
        }
        this.orientacion = orientacion;

        posicion = new ArrayList<Posicion>();
        fin_mejor_ruta = -1;
        pos_carro = new Posicion(0, 32, 24, 32 + 16);
    }

    public void setPuntos(int punto1, int punto2, byte orientacion) {
        if (orientacion == HORIZONTAL) {
            this.posicion_x = (punto2 - 1) * 48;
            this.posicion_y = punto1 * 48 - 1;
        } else if (orientacion == VERTICAL) {
            this.posicion_x = punto1 * 48 - 1;
            this.posicion_y = (punto2 - 1) * 48;
        }
        this.orientacion = orientacion;

        posicion = new ArrayList<Posicion>();
        fin_mejor_ruta = -1;
    }

    public void setSolucion(ArrayList<String> rutas) {
        this.rutas = rutas;
    }

    public void run() {
        try {
            Thread.sleep(1000);
            inicioEmulacion = true;
            for (int r = 0; r < rutas.size(); r++) {
                int pos_x = posicion_x;
                int pos_y = posicion_y;
                String entrada = rutas.get(r);
                for (int i = 0; i < entrada.length(); i++) {
                    if (orientacion == HORIZONTAL) {
                        for (int ruta = 0; ruta < 10; ruta++) {
                            if (ruta % 2 == 0) {
                                switch (entrada.charAt(i)) {
                                    case 'A':
                                        posicion.add(new Posicion(pos_x, pos_y + ruta * 5, 3, 5));
                                        break;
                                    case 'B':
                                        posicion.add(new Posicion(pos_x, pos_y - ruta * 5, 3, 5));
                                        break;
                                    case 'C':
                                        posicion.add(new Posicion(pos_x + ruta * 5, pos_y, 5, 3));
                                        break;
                                    case 'D':
                                        posicion.add(new Posicion(pos_x - ruta * 5, pos_y, 5, 3));
                                        break;
                                }
                                repaint();
                                Thread.sleep(200);
                            }
                        }
                        switch (entrada.charAt(i)) {
                            case 'A':
                                pos_y += 48;
                                break;
                            case 'B':
                                pos_y -= 48;
                                break;
                            case 'C':
                                pos_x += 48;
                                break;
                            case 'D':
                                pos_x -= 48;
                                break;
                        }
                    } else if (orientacion == VERTICAL) {
                        for (int ruta = 0; ruta < 10; ruta++) {
                            if (ruta % 2 == 0) {
                                switch (entrada.charAt(i)) {
                                    case 'A':
                                        posicion.add(new Posicion(pos_x - ruta * 5, pos_y, 5, 3));
                                        break;
                                    case 'B':
                                        posicion.add(new Posicion(pos_x + ruta * 5, pos_y, 5, 3));
                                        break;
                                    case 'C':
                                        posicion.add(new Posicion(pos_x, pos_y + ruta * 5, 3, 5));
                                        break;
                                    case 'D':
                                        posicion.add(new Posicion(pos_x, pos_y - ruta * 5, 3, 5));
                                        break;
                                }
                                repaint();
                                Thread.sleep(200);
                            }
                        }
                        switch (entrada.charAt(i)) {
                            case 'A':
                                pos_x -= 48;
                                break;
                            case 'B':
                                pos_x += 48;
                                break;
                            case 'C':
                                pos_y += 48;
                                break;
                            case 'D':
                                pos_y -= 48;
                                break;
                        }
                    }
                }
                if (r == 0) {
                    fin_mejor_ruta = posicion.size();
                }
                //System.out.println(fin_mejor_ruta);
            }

            posicion_y -= 10;
            String entrada = rutas.get(0);
            //System.out.println(entrada);
            for (int i = 0; i < entrada.length(); i++) {

                if (orientacion == HORIZONTAL) {
                    switch (entrada.charAt(i)) {
                        case 'A':
                            pos_carro.y = 64;
                            pos_carro.height = 64 + 16;
                            break; //pos_y+=48; break;
                        case 'B':
                            pos_carro.y = 80;
                            pos_carro.height = 80 + 16;
                            break;//pos_y-=48; break;
                        case 'C':
                            pos_carro.y = 32;
                            pos_carro.height = 32 + 16;
                            break;//pos_x+=48; break;
                        case 'D':
                            pos_carro.y = 48;
                            pos_carro.height = 48 + 16;
                            break;//pos_x-=48; break;
                    }
                    repaint();
                    for (int ruta = 0; ruta < 48; ruta++) {
                        switch (entrada.charAt(i)) {
                            case 'A':
                                posicion_y++;
                                break;
                            case 'B':
                                posicion_y--;
                                break;
                            case 'C':
                                posicion_x++;
                                break;
                            case 'D':
                                posicion_x--;
                                break;
                        }
                        repaint();
                        Thread.sleep(50);
                    }

                } else if (orientacion == VERTICAL) {
                    switch (entrada.charAt(i)) {
                        case 'A':
                            pos_carro.y = 48;
                            pos_carro.height = 48 + 16;
                            break;//pos_x-=48; break;
                        case 'B':
                            pos_carro.y = 32;
                            pos_carro.height = 32 + 16;
                            break;//pos_x+=48; break;
                        case 'C':
                            pos_carro.y = 64;
                            pos_carro.height = 64 + 16;
                            break; //pos_y+=48; break;
                        case 'D':
                            pos_carro.y = 80;
                            pos_carro.height = 80 + 16;
                            break;//pos_y-=48; break;
                    }
                    repaint();
                    for (int ruta = 0; ruta < 48; ruta++) {
                        switch (entrada.charAt(i)) {
                            case 'A':
                                posicion_x--;
                                break;
                            case 'B':
                                posicion_x++;
                                break;
                            case 'C':
                                posicion_y++;
                                break;
                            case 'D':
                                posicion_y--;
                                break;
                        }
                        repaint();
                        Thread.sleep(50);
                    }
                }
            }
        } catch (Exception e) {
        }
    }

    public void paint(Graphics g) {
        Graphics2D g2d = (Graphics2D) g;

        for (int x = 0; x < 2; x++) {
            //Los que forman la fila 13 y 14
            g2d.drawImage(escenario, x * ancho, 3 * alto, (x * ancho) + ancho, 
                    3 * alto + 96, 0, 0, ancho, 96, this);
            //Los que forman la columna 13
            g2d.drawImage(escenario, 2 * ancho, x * alto, (2 * ancho) + 48, 
                    (x * alto) + alto, 0, 0, 48, alto, this);
            for (int y = 0; y < 3; y++) {
                g2d.drawImage(escenario, x * ancho, y * alto, this);
            }
        }

        g2d.drawImage(escenario, 2 * ancho, 2 * alto, (2 * ancho) + 48, 
                (2 * alto) + alto, 0, 0, 48, alto, this);
        g2d.drawImage(escenario, 2 * ancho, 3 * alto, (2 * ancho) + 48, 
                (3 * alto) + 96, 0, 0, 48, 96, this);

        if (inicioEmulacion) {
            g2d.setColor(Color.BLUE);

            for (int i = 0; i < posicion.size(); i++) {
                Posicion pos = posicion.get(i);
                if (fin_mejor_ruta == i) {
                    g2d.setColor(Color.RED);
                }
                g2d.fillRect(pos.x, pos.y, pos.width, pos.height);
            }
        }

        g2d.drawImage(semaforo, 40, 3 * 48 - 8, this);
        //g2d.drawImage(carro,posicion_x,posicion_y,posicion_x+24,posicion_y+16,0,32,24,32+16,this);
        g2d.drawImage(carro, posicion_x, posicion_y, posicion_x + 24, posicion_y + 16,
                pos_carro.x, pos_carro.y, pos_carro.width, pos_carro.height, this);
        
    }
    Image escenario;
    Image semaforo;
    Image carro;
    int ancho = 289;
    int alto = 192;
    /*
     * int ancho = 48; int alto = 48;
     */
    int posicion_x, posicion_y;
    public byte orientacion;
    public static final byte HORIZONTAL = 1;
    public static final byte VERTICAL = 2;
    boolean inicioEmulacion = false;
    ArrayList<Posicion> posicion;
    int fin_mejor_ruta;
    ArrayList<String> rutas;
    Posicion pos_carro;
}
